package com.jeesite.modules.utils;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.jeesite.modules.config.PaymentConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;

/**
 * 支付宝工具类 - 真实SDK实现
 * @author LaVenderGong
 * @version 2025-08-16
 */
@Component
public class AlipayUtil {
    
    @Autowired
    private PaymentConfig paymentConfig;
    
    private AlipayClient alipayClient;
    
    /**
     * 获取支付宝客户端实例
     * 懒加载模式，第一次使用时初始化
     */
    private AlipayClient getAlipayClient() {
        if (alipayClient == null) {
            PaymentConfig.Alipay config = paymentConfig.getAlipay();
            // 创建支付宝客户端
            alipayClient = new DefaultAlipayClient(
                config.getServerUrl(),    // 支付宝网关地址
                config.getAppId(),        // 应用ID
                config.getPrivateKey(),   // 应用私钥
                config.getFormat(),       // 数据格式：JSON
                config.getCharset(),      // 字符编码：UTF-8
                config.getPublicKey(),    // 支付宝公钥
                config.getSignType()      // 签名算法：RSA2
            );
        }
        return alipayClient;
    }
    
    /**
     * 创建支付宝支付订单
     * @param orderId 订单号
     * @param amount 支付金额（元）
     * @param subject 商品标题
     * @return 支付结果，包含支付页面HTML或支付链接
     */
    public Map<String, Object> createPayment(String orderId, String amount, String subject) {
        Map<String, Object> result = new HashMap<>();
        
        try {
            PaymentConfig.Alipay config = paymentConfig.getAlipay();
            
            // 创建支付请求对象
            AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
            
            // 设置回调地址
            request.setNotifyUrl(config.getNotifyUrl());  // 异步通知地址
            request.setReturnUrl(config.getReturnUrl());  // 同步跳转地址
            
            // 构建请求参数
            Map<String, Object> bizContent = new HashMap<>();
            bizContent.put("out_trade_no", orderId);           // 商户订单号
            bizContent.put("total_amount", amount);            // 订单总金额（元）
            bizContent.put("subject", subject);                // 订单标题
            bizContent.put("body", "KBB服务器捐赠支持");        // 订单描述
            bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY"); // 产品码（PC支付）
            
            // 设置业务参数
            request.setBizContent(bizContent.toString());
            
            // 调用支付宝API
            AlipayTradePagePayResponse response = getAlipayClient().pageExecute(request);
            
            if (response.isSuccess()) {
                // 支付成功，返回支付页面HTML
                result.put("success", true);
                result.put("payUrl", response.getBody());      // 支付页面HTML
                result.put("orderId", orderId);
                result.put("message", "支付宝订单创建成功");
            } else {
                // 支付失败
                result.put("success", false);
                result.put("message", "创建支付宝订单失败: " + response.getMsg());
                result.put("errorCode", response.getCode());
            }
            
        } catch (AlipayApiException e) {
            // API调用异常
            result.put("success", false);
            result.put("message", "支付宝API调用失败: " + e.getMessage());
            result.put("errorCode", e.getErrCode());
        } catch (Exception e) {
            // 其他异常
            result.put("success", false);
            result.put("message", "创建支付宝订单失败: " + e.getMessage());
        }
        
        return result;
    }

    /**
     * 创建支付宝预创建支付（扫码支付）
     * @param orderId 订单号
     * @param amount 支付金额（元）
     * @param subject 商品标题
     * @return 支付结果，包含二维码链接
     */
    public Map<String, Object> createPrecreatePayment(String orderId, String amount, String subject) {
        Map<String, Object> result = new HashMap<>();

        try {
            PaymentConfig.Alipay config = paymentConfig.getAlipay();

            // 创建预创建支付请求对象
            AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();

            // 设置回调地址
            request.setNotifyUrl(config.getNotifyUrl());  // 异步通知地址

            // 构建请求参数
            Map<String, Object> bizContent = new HashMap<>();
            bizContent.put("out_trade_no", orderId);           // 商户订单号
            bizContent.put("total_amount", amount);            // 订单总金额（元）
            bizContent.put("subject", subject);                // 订单标题
            bizContent.put("body", "KBB服务器捐赠支持");        // 订单描述

            // 设置业务参数
            request.setBizContent(bizContent.toString());

            // 调用支付宝API
            AlipayTradePrecreateResponse response = getAlipayClient().execute(request);

            if (response.isSuccess()) {
                // 预创建成功，返回二维码链接
                result.put("success", true);
                result.put("qrCode", response.getQrCode());     // 二维码链接
                result.put("orderId", orderId);
                result.put("message", "支付宝预创建订单成功");
            } else {
                // 预创建失败
                result.put("success", false);
                result.put("message", "创建支付宝预创建订单失败: " + response.getMsg());
                result.put("errorCode", response.getCode());
            }

        } catch (AlipayApiException e) {
            // API调用异常
            result.put("success", false);
            result.put("message", "支付宝API调用失败: " + e.getMessage());
            result.put("errorCode", e.getErrCode());
        } catch (Exception e) {
            // 其他异常
            result.put("success", false);
            result.put("message", "创建支付宝预创建订单失败: " + e.getMessage());
        }

        return result;
    }

    /**
     * 验证支付宝回调签名
     * @param params 回调参数Map
     * @return 验证结果，true表示验证通过
     */
    public boolean verifyCallback(Map<String, String> params) {
        try {
            PaymentConfig.Alipay config = paymentConfig.getAlipay();
            
            // 使用支付宝SDK验证签名
            boolean isValid = AlipaySignature.rsaCheckV1(
                params,                    // 回调参数
                config.getPublicKey(),     // 支付宝公钥
                config.getCharset(),       // 字符编码
                config.getSignType()       // 签名算法
            );
            
            return isValid;
            
        } catch (AlipayApiException e) {
            // 签名验证异常
            System.err.println("支付宝签名验证失败: " + e.getMessage());
            return false;
        } catch (Exception e) {
            // 其他异常
            System.err.println("支付宝回调验证异常: " + e.getMessage());
            return false;
        }
    }
    
    /**
     * 查询支付宝订单状态
     * @param orderId 商户订单号
     * @return 查询结果
     */
    public Map<String, Object> queryOrderStatus(String orderId) {
        Map<String, Object> result = new HashMap<>();
        
        try {
            // 创建查询请求
            AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
            
            // 设置查询参数
            Map<String, Object> bizContent = new HashMap<>();
            bizContent.put("out_trade_no", orderId);  // 商户订单号
            request.setBizContent(bizContent.toString());
            
            // 执行查询
            AlipayTradeQueryResponse response = getAlipayClient().execute(request);
            
            if (response.isSuccess()) {
                // 查询成功
                result.put("success", true);
                result.put("tradeStatus", response.getTradeStatus());    // 交易状态
                result.put("tradeNo", response.getTradeNo());            // 支付宝交易号
                result.put("totalAmount", response.getTotalAmount());    // 交易金额
                result.put("buyerPayAmount", response.getBuyerPayAmount()); // 买家实付金额
            } else {
                // 查询失败
                result.put("success", false);
                result.put("message", response.getMsg());
                result.put("errorCode", response.getCode());
            }
            
        } catch (AlipayApiException e) {
            result.put("success", false);
            result.put("message", "查询支付宝订单失败: " + e.getMessage());
        }
        
        return result;
    }
    
    /**
     * 检查支付宝配置是否完整
     * @return 配置检查结果
     */
    public boolean checkConfig() {
        try {
            PaymentConfig.Alipay config = paymentConfig.getAlipay();
            
            // 检查必要配置项
            return config.getAppId() != null && !config.getAppId().isEmpty() &&
                   config.getPrivateKey() != null && !config.getPrivateKey().isEmpty() &&
                   config.getPublicKey() != null && !config.getPublicKey().isEmpty() &&
                   config.getNotifyUrl() != null && !config.getNotifyUrl().isEmpty();
                   
        } catch (Exception e) {
            return false;
        }
    }
}
